home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / cuj0593.zip / 1105102A < prev    next >
Text File  |  1993-03-09  |  4KB  |  170 lines

  1. /* view.c
  2.  *
  3.  *      VALID COMMANDS:
  4.  *          D       scroll Down 1 screen
  5.  *          U       scroll Up 1 screen
  6.  *          B       go to Bottom of file
  7.  *          T       go to Top of file
  8.  *          L       scroll Left a partial screen
  9.  *          R       scroll Right a partial screen
  10.  *          Q or X  quit
  11.  */
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <ctype.h>
  17. #include "stack.h"
  18. #include "ansi.h"
  19.  
  20. #define NROWS   24  /* Height of screen - 1*/
  21. #define NCOLS   79  /* Width of screen - 1 */
  22. #define HORIZ   32  /* Horiz. scroll increment */
  23.  
  24. #define MAXSTACK 500    /* Max # of screens */
  25.  
  26. /* Buffer for current screen */
  27. static char Screen[NROWS][BUFSIZ];
  28.  
  29. static size_t
  30.   Nlines,     /* Number of lines to display */
  31.   Offset = 0; /* Horizontal display offset */
  32.  
  33. static void read_a_screen(FILE *);
  34. static void display(void);
  35. static void display_banner(char *, size_t);
  36.  
  37. main(int argc, char *argv[])
  38. {
  39.     FILE *f;
  40.     char *file;
  41.     fpos_t top_pos, stk_[MAXSTACK];
  42.     size_t stkptr_ = 0;
  43.     int c;
  44.  
  45.     /* Open input file */
  46.     if (argc == 1 || (f = fopen(argv[1],"r")) == NULL)
  47.     {
  48.         fputs("No such file.\n",stderr);
  49.         return EXIT_FAILURE;
  50.     }
  51.     file = argv[1];
  52.  
  53. top:
  54.     /* Display initial screen */
  55.     rewind(f);
  56.     fgetpos(f,&top_pos);
  57.     read_a_screen(f);
  58.     display();
  59.     display_banner(file,stkptr_+1);
  60.  
  61.     for (;;)
  62.     {
  63.         switch(c = toupper(getchar()))
  64.         {
  65.             case 'D':   /* Display the next screen */
  66.                 if (!feof(f))
  67.                 {
  68.                     PUSH(top_pos);
  69.                     fgetpos(f,&top_pos);
  70.                     read_a_screen(f);
  71.                     display();
  72.                 }
  73.                 break;
  74.  
  75.             case 'U':   /* Display the previous screen */
  76.                 if (stkptr_ > 0)
  77.                 {
  78.                     top_pos = POP();
  79.                     fsetpos(f,&top_pos);
  80.                     read_a_screen(f);
  81.                     display();
  82.                 }
  83.                 break;
  84.  
  85.             case 'T':   /* Display first screen */
  86.                 stkptr_ = 0;
  87.                 goto top;
  88.  
  89.             case 'B':   /* Display last screen */
  90.                 while (!feof(f))
  91.                 {
  92.                     PUSH(top_pos);
  93.                     fgetpos(f,&top_pos);
  94.                     read_a_screen(f);
  95.                 }
  96.                 display();
  97.                 break;
  98.  
  99.             case 'L':   /* Scroll left */
  100.                 if (Offset > 0)
  101.                 {
  102.                     Offset -= HORIZ;
  103.                     display();
  104.                 }
  105.                 break;
  106.  
  107.             case 'R':   /* Scroll right */
  108.                 if (Offset < BUFSIZ-HORIZ)
  109.                 {
  110.                     Offset += HORIZ;
  111.                     display();
  112.                 }
  113.                 break;
  114.  
  115.             case 'Q':   /* Quit */
  116.             case 'X':
  117.                 cls();
  118.                 return EXIT_SUCCESS;
  119.         }
  120.         
  121.         if (c != '\n')
  122.             getchar();  /* Eat '\n' */
  123.         display_banner(file,stkptr_+1);
  124.     }
  125. }
  126.  
  127. static void read_a_screen(FILE *f)
  128. {
  129.     int i;
  130.  
  131.     clearerr(f);
  132.     for (
  133.          i = 0;
  134.          i < NROWS && fgets(Screen[i],BUFSIZ,f);
  135.          ++i
  136.         )
  137.         Screen[i][strlen(Screen[i])-1] = '\0';
  138.     Nlines = i;
  139. }
  140.  
  141. static void display(void)
  142. {
  143.     int i;
  144.  
  145.     /* Display a screenful of text */
  146.     cls();
  147.     for (i = 0; i < Nlines; ++i)
  148.         if (Offset < strlen(Screen[i]))
  149.         {
  150.             setcur(i+2,1);
  151.             fprintf(stderr,"%.*s",NCOLS,Screen[i]+Offset);
  152.         }
  153. }
  154.  
  155. static void display_banner(char *fname, size_t screen_num)
  156. {
  157.     char banner[NCOLS+1];
  158.  
  159.     /* Display banner line in reverse video */
  160.     setcur(1,1); rvs();
  161.     sprintf(banner,
  162.       "File: %s     Screen: %d     Columns: %d-%d",
  163.       fname,screen_num,Offset+1,Offset+NCOLS);
  164.     strcat(banner,"        Command? ");
  165.     fprintf(stderr,"%-*.*s",NCOLS,NCOLS,banner);
  166.     reset();
  167.     setcur(1,strlen(banner)+1);
  168. }
  169.  
  170.